import 'package:event_bus/event_bus.dart';
import 'package:flutter/material.dart';


void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {


  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(

          appBar: AppBar(title: Text("首页"),),
          body: MyHomeBodyRow()
      )

    );
  }
}

class MyHomePage extends StatelessWidget{
  @override
  Widget build(BuildContext context) {

    return Center(
      child: Listener(
        child: Container(
          width: 200,
          height: 200,
          color: Colors.red,
        ),
        onPointerDown: (event)=>
          print("手指按下：$event")
        ,
        onPointerMove: (event)=>
        print("手指移动：$event")
      ,
        onPointerUp: (event)=>
        print("手指抬起：$event")
      ,
      ),
    );
  }
}

class HYHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("手势测试"),
      ),
      /**
       * 从Widget的层面来监听手势，我们需要使用：GestureDetector
          当然，我们也可以使用RaisedButton、FlatButton、InkWell等来监听手势
          globalPosition用于获取相对于屏幕的位置信息
          localPosition用于获取相对于当前Widget的位置信息
       */
      body: GestureDetector(
          child: Container(
            width: 200,
            height: 200,
            color: Colors.red,
          ),
          onTap: () {

          },
          onTapDown: (detail) {
            print("onTapDown:${detail.globalPosition}");
            print(detail.localPosition);
          },
          onTapUp: (detail) {
            print("onTapUp:${detail.globalPosition}");
            print(detail.localPosition);
          }
      ),
    );
  }
}
///在组件之间如果有事件需要传递，一方面可以一层层来传递，另一方面我们也可以使用一个EventBus工具来完成。
//其实EventBus在Vue、React中都是一种非常常见的跨组件通信的方式：
//EventBus相当于是一种订阅者模式，通过一个全局的对象来管理；
//这个EventBus我们可以自己实现，也可以使用第三方的EventBus；
///
final eventBus = EventBus();
class UserInfo {
  String nickname;
  int level;

  UserInfo(this.nickname, this.level);
}

class HYButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      child: Text("HYButton"),
      onPressed: () {
        final info = UserInfo("why", 18);
        //在某个Widget中，发出事件：
        eventBus.fire(info);
      },
    );
  }
}

class HYText extends StatefulWidget {
  @override
  _HYTextState createState() => _HYTextState();
}

class _HYTextState extends State<HYText> {
  String message = "Hello Coderwhy";

  @override
  void initState() {
    super.initState();

    //在某个Widget中，监听事件
    eventBus.on<UserInfo>().listen((data) {
      setState(() {
        message = "${data.nickname}-${data.level}";
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Text(message, style: TextStyle(fontSize: 30),);
  }
}

class MyHomeBodyRow extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      crossAxisAlignment: CrossAxisAlignment.end,
      /**
       * 默认情况下，Row会尽可能占据多的宽度，让子Widget在其中进行排布，这是因为mainAxisSize属性默认值是MainAxisSize.max。
       */
      mainAxisSize: MainAxisSize.max,
      children: <Widget>[
        HYButton(),
        HYText()
      ],
    );
  }
}










